home *** CD-ROM | disk | FTP | other *** search
/ PCMania 53 / PCMania CD53_1.iso / pcmania / virus53 / buscaexe.c next >
C/C++ Source or Header  |  1997-01-18  |  15KB  |  442 lines

  1. /*----------------------------------------------*/
  2. /* BUSCAEXE (c) 1997 Por Javier Guerrero Díaz 
  3. /* Busca en la memoria, boot de disketes 
  4. /* y MBR del disco duro el virus ANTIEXE.
  5. /* La sintaxis es: BUSCAEXE <unidad>.
  6. /* Programado con Borland C++ 5.01
  7. /*----------------------------------------------*/
  8. /*      Javier Guerrero Díaz     */
  9. /*                 */
  10. /*        'jgd@redestb.es'       */
  11. /*-------------------------------*/
  12.  
  13. #include <stdio.h>
  14. #include <dos.h>
  15. #include <dir.h>
  16. #include <conio.h>
  17. #include <bios.h>
  18. #include <stdlib.h>
  19. #include <direct.h>
  20. #include <string.h>
  21.  
  22. void intro(void);
  23. void buscamem(void);
  24. void busca(void);
  25. void leeboot(void);
  26. void errorhand(int);
  27. void buscaenboot(void);
  28. void mensaje(char *mensa);
  29. void matavir(void);
  30. void panta(void);
  31. void fin(void);
  32. void mal(void);
  33.  
  34. int far *direcc;
  35. char far *memo;
  36. char tecla,flag,unidad,cambio,buffer[512],letra;
  37. char cadena[]={ 0x33,0xFF,0x8E,0xDF,0xC4,0x16,0x4C,0x00,0x89,0x16,0x4C,
  38.         0x03,0x8C,0x06,0x4E,0x03,0xFA,0x8E,0xD7,0xBE,0x00,0x7C,
  39.         0x8B,0xE6,0xFB };
  40.  
  41. int segmento,despl,pulsa,temp;
  42.  
  43. void main(argc,argv)
  44. int argc;
  45. char *argv[];
  46. {
  47. letra=*argv[1];
  48. if (*argv[1]=='a' || *argv[1]=='A') unidad=0;
  49. else if (*argv[1]=='b' || *argv[1]=='B') unidad=1;
  50. else if (*argv[1]=='c' || *argv[1]=='C') unidad=0x80;
  51. else if (*argv[1]=='d' || *argv[1]=='D') unidad=0x81;
  52.  
  53. else {  printf("\nBUSCAEXE (c)1997 Por Javier Guerrero Díaz\n");
  54.     printf("Sintaxis: BUSCAEXE <unidad>\n"); exit(-1); }
  55.  
  56. setcbrk(1);
  57. _setcursortype(_NOCURSOR);
  58.  
  59. intro();
  60. panta();
  61. buscamem();
  62. leeboot();
  63. buscaenboot();
  64. }
  65.  
  66. void matavir(void)
  67. {
  68. short resultado1;
  69. int resultado2,cx,ax;
  70. char head,sector;
  71.  
  72. if (unidad==0 || unidad==1) 
  73. {  
  74. memo=&buffer[4]; cx=*memo; sector=cx;
  75. memo=&buffer[6]; head=*memo;
  76. }
  77. else { sector=0x0D; head=0; }
  78.  
  79. textattr(LIGHTGRAY|BLACK<<4); clrscr(); panta();
  80. window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
  81. cprintf("                                                  ");
  82. gotoxy(24,23); cprintf("Leyendo boot original ..."); sleep(1);
  83. gotoxy(24,23);
  84. cprintf("                                                  ");                 
  85.  
  86. asm     mov     ah,0
  87. asm     mov     dl,byte ptr unidad
  88. asm     int     13h
  89. resultado1=_AH;
  90.     if (resultado1 !=0) errorhand(resultado1);
  91.  
  92. asm     mov     ah,15h
  93. asm     mov     dl,byte ptr unidad
  94. asm     int     13h
  95. asm     mov     byte ptr cambio,ah
  96.  
  97. asm     mov     ah,2
  98. asm     mov     dl,byte ptr unidad
  99. asm     mov     dh,byte ptr head
  100. asm     mov     ch,0
  101. asm     mov     cl,byte ptr sector
  102. asm     mov     al,1
  103. asm     mov     es,segmento
  104. asm     mov     bx,despl
  105. asm     int     13h
  106. asm     mov     resultado2,ax
  107.     if (unidad==0 && resultado2 !=0x0001) 
  108.         errorhand(resultado2);
  109.     else if (unidad==1 && resultado2 !=0x0001)
  110.         errorhand(resultado2);
  111.     else if (unidad==0x80 && resultado2!=0) 
  112.         errorhand(resultado2);
  113.     else if (unidad==0x81 && resultado2!=0)
  114.         errorhand(resultado2);
  115.  
  116. window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
  117. cprintf("                                                  ");
  118. gotoxy(24,23); cprintf("Restaurando boot original ..."); sleep(1);
  119. gotoxy(24,23);
  120. cprintf("                                                  ");                 
  121.  
  122. asm     mov     ah,3
  123. asm     mov     dl,byte ptr unidad
  124. asm     mov     dh,0
  125. asm     mov     ch,0
  126. asm     mov     cl,1
  127. asm     mov     al,1
  128. asm     mov     es,segmento
  129. asm     mov     bx,despl
  130. asm     int     13h
  131. asm     mov     resultado2,ax
  132.     if (unidad==0 && resultado2 !=0x0001) 
  133.         errorhand(resultado2);
  134.     else if (unidad==1 && resultado2 !=0x0001)
  135.         errorhand(resultado2);
  136.     else if (unidad==0x80 && resultado2!=0) 
  137.         errorhand(resultado2);
  138.     else if (unidad==0x81 && resultado2!=0)
  139.         errorhand(resultado2);
  140.  
  141. window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
  142. cprintf("                                                  ");
  143. gotoxy(24,23); cprintf("OK. Virus ANTIEXE eliminado."); sleep(1);
  144. gotoxy(24,23);
  145. cprintf("                                                  ");
  146. }
  147.  
  148. void buscaenboot(void)
  149. {
  150. memo=&buffer[0x117];
  151.      for (temp=0;temp<sizeof cadena;temp++)
  152.         {
  153.          if (*memo!=cadena[temp]) goto noinfec;
  154.          else memo++;
  155.         }
  156.      window(17,7,63,15); textattr(WHITE|RED<<4); putch(7);
  157.      cprintf("╔═════════════════════════════════════════════╗");
  158.          cprintf("║ Atención: Se encontró la marca de infección ║");
  159.      cprintf("║  propia del virus ANTIEXE en el boot sector ║");
  160.      cprintf("║               de la unidad %c: .             ║",letra);
  161.      cprintf("║    Esta unidad se encuentra infectada por   ║");
  162.      cprintf("║    el virus. Pulse 'SUPR' para eliminarlo   ║");
  163.      cprintf("║ o cualquier tecla para analizar otro disco. ║");
  164.      cprintf("╚═════════════════════════════════════════════╝");
  165.      mensaje("¡ Sector de arranque infectado !");
  166.      pulsa=bioskey(0);
  167.         switch (pulsa)
  168.         {
  169.             case 283:       fin();
  170.                     break;
  171.             case 0x5300:    matavir();
  172.                     goto tecl;
  173.             case 0x532E:    matavir();
  174.                     goto tecl;
  175.             default:        goto tecl;
  176.         }
  177. noinfec: if (flag==1) { window(17,7,63,19);
  178.      cprintf("╔═════════════════════════════════════════════╗");
  179.          cprintf("║   Aviso: No se ha encontrado la marca de    ║");
  180.          cprintf("║   infección del virus ANTIEXE. Aunque esta  ║");
  181.      cprintf("║  unidad no esté infectada, si en el chequeo ║");
  182.      cprintf("║  de memoria previo se detectó una disminu-  ║");
  183.      cprintf("║ ción en la cantidad de memoria convencional ║");
  184.      cprintf("║  es posible que algún otro virus, como por  ║");
  185.          cprintf("║ ejemplo, el RIPPER, se encuentre residente. ║");
  186.      cprintf("║ Se recomienda chequear con otros detectores.║");
  187.      cprintf("║                                             ║");
  188.      cprintf("║  Pulse una tecla para analizar otro disco.  ║");
  189.      cprintf("╚═════════════════════════════════════════════╝");
  190.      mensaje("Disco limpio. Se recomienda chequeo."); goto press;
  191.     }
  192.     else  window(17,7,63,15); textattr(WHITE|CYAN<<4);
  193.      cprintf("╔═════════════════════════════════════════════╗");
  194.      cprintf("║  OK! El sector de arranque de la unidad %c:  ║",letra);
  195.      cprintf("║   no se encuentra infectado por el virus    ║");
  196.          cprintf("║      ANTIEXE. Esta unidad está limpia.      ║");  
  197.      cprintf("║  Pulse una tecla para comprobar otro disco  ║");
  198.          cprintf("║  o vuelva a ejecutar BUSCAEXE para chequear ║");
  199.      cprintf("║  una unidad de disco diferente a la actual. ║");
  200.      cprintf("╚═════════════════════════════════════════════╝");
  201.      window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
  202.      cprintf("                                                  ");
  203.      gotoxy(24,23); cprintf("OK. Disco limpio.");
  204.      sleep(1); gotoxy(24,23);
  205.      cprintf("                                                  ");                 
  206.  
  207. press:  pulsa=bioskey(0);
  208. tecl:   switch (pulsa)
  209.     {
  210.         case 283: fin();
  211.         default:  panta();
  212.               leeboot();
  213.               buscaenboot();
  214.     }       
  215. }
  216.  
  217. void leeboot(void)
  218. {
  219. short resultado1;
  220. int resultado2;
  221.  
  222. segmento=FP_SEG(buffer); despl=FP_OFF(buffer); 
  223. direcc=(char far *)MK_FP(segmento,despl);
  224.  
  225. window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
  226. cprintf("                                                  ");
  227. gotoxy(24,23); cprintf("Leyendo boot..."); sleep(1);
  228. gotoxy(24,23);
  229. cprintf("                                                  ");                 
  230.  
  231. asm     mov     ah,0
  232. asm     mov     dl,byte ptr unidad
  233. asm     int     13h
  234. resultado1=_AH;
  235.     if (resultado1 !=0) errorhand(resultado1);
  236.  
  237. asm     mov     ah,15h
  238. asm     mov     dl,byte ptr unidad
  239. asm     int     13h
  240. asm     mov     byte ptr cambio,ah
  241.  
  242. asm     mov     ah,2
  243. asm     mov     dl,byte ptr unidad
  244. asm     mov     dh,0
  245. asm     mov     ch,0
  246. asm     mov     cl,1
  247. asm     mov     al,1
  248. asm     mov     es,segmento
  249. asm     mov     bx,despl
  250. asm     int     13h
  251. asm     mov     resultado2,ax
  252.     if (unidad==0 && resultado2 !=0x0001) 
  253.         errorhand(resultado2);
  254.     else if (unidad==1 && resultado2 !=0x0001)
  255.         errorhand(resultado2);
  256.     else if (unidad==0x80 && resultado2!=0) 
  257.         errorhand(resultado2);
  258.     else if (unidad==0x81 && resultado2!=0)
  259.         errorhand(resultado2);
  260. }
  261.  
  262. void buscamem(void)
  263. {
  264. window(18,7,62,11);
  265. textattr(WHITE|BLUE<<4);
  266. cprintf("╔═══════════════════════════════════════════╗");
  267. cprintf("║  Atención: Buscando virus ANTIEXE en RAM. ║");
  268. cprintf("║         Analizando la memoria ....        ║");
  269. cprintf("╚═══════════════════════════════════════════╝");
  270. sleep(1);
  271. busca();
  272. }
  273.  
  274. void busca(void)
  275. {
  276. char far *cop;
  277. char dummy;
  278.  
  279. direcc=(int far *)MK_FP(0x0000,0x0413);
  280. if (*direcc<0x280) 
  281.     { 
  282.      window(17,7,63,15); textattr(YELLOW|RED<<4); putch(7); flag=1;
  283.      cprintf("╔═════════════════════════════════════════════╗");
  284.      cprintf("║   Atención: La cantidad de memoria conven-  ║");
  285.      cprintf("║ cional en el sistema es inferior a 640 Kb;  ║");
  286.          cprintf("║  como otros muchos virus, el ANTIEXE produ- ║");
  287.      cprintf("║  ce este efecto. Se realizará un analisis   ║");
  288.      cprintf("║ de la memoria para determinar la existencia ║");
  289.          cprintf("║       en la misma del virus ANTIEXE.        ║");
  290.      cprintf("╚═════════════════════════════════════════════╝");
  291.      mensaje("Encontrado síntoma de infección vírica."); sleep(5);       
  292.      textattr(LIGHTGRAY|BLACK<<4); clrscr(); panta();
  293.      }
  294. else goto noresid; 
  295. segmento=*direcc*64; despl=0x117;
  296. memo=(char far *)MK_FP(segmento,despl); 
  297. cop=(char far *)MK_FP(segmento,0);
  298. for (temp=0;temp<sizeof cadena;temp++)
  299.     {
  300.      if (*memo!=cadena[temp]) goto noresid;
  301.      else memo++;
  302.     }
  303. flag=2; window(14,7,66,21); textattr(YELLOW|RED<<4); 
  304. putch(7); 
  305. cprintf("╔═══════════════════════════════════════════════════╗");
  306. cprintf("║       Atención: Virus ANTIEXE detectado en la     ║");
  307. cprintf("║          dirección de memoria : %X:0000         ║",segmento);
  308. cprintf("╟───────────────────────────────────────────────────╢");
  309. cprintf("║                                                   ║");
  310. cprintf("║                                                   ║");
  311. cprintf("║                                                   ║");
  312. cprintf("║                                                   ║");
  313. cprintf("║                                                   ║");
  314. cprintf("║                                                   ║");
  315. cprintf("║                                                   ║");
  316. cprintf("║                                                   ║");
  317. cprintf("║                                                   ║");
  318. cprintf("╚═══════════════════════════════════════════════════╝");
  319. window(15,11,65,20); textattr(WHITE|RED<<4);
  320. for (temp=0;temp<459;temp++) 
  321. { dummy=*cop; if (dummy<32) dummy='.'; cprintf("%c",dummy); cop++; }                    
  322. mensaje("¡ Virus encontrado en memoria !"); textattr(LIGHTGRAY|BLACK<<4);
  323. sleep(5); clrscr(); panta();
  324. window(17,7,63,15);
  325. cprintf("╔═════════════════════════════════════════════╗");
  326. cprintf("║  Aviso: El virus se encuentra en memoria.   ║");
  327. cprintf("║ Aunque el programa continuará su ejecucion, ║");
  328. cprintf("║la infección NO SERA DETECTADA. Arranque con ║");
  329. cprintf("║ un S.O. limpio y ejecute de nuevo BUSCAEXE. ║");
  330. cprintf("║                                             ║");
  331. cprintf("║                                             ║");
  332. cprintf("╚═════════════════════════════════════════════╝");
  333. window(23,13,62,13); textattr(YELLOW|BLUE<<4);
  334. cprintf("Analizando boot de unidad %c: .....",letra); sleep(2);
  335. leeboot(); buscaenboot();
  336. noresid:
  337. window(18,7,62,11);
  338. cprintf("╔═══════════════════════════════════════════╗");
  339. cprintf("║   OK !. No se encontró el virus en RAM.   ║");
  340. cprintf("║     Analizando boot de unidad %c: ....     ║",letra);
  341. cprintf("╚═══════════════════════════════════════════╝");
  342. }
  343.  
  344. void intro(void)
  345. {
  346. clrscr(); gotoxy(20,9); textattr(YELLOW|BLUE<<4);
  347. cprintf("╔═════════════════════════════════════╗\n"); gotoxy(20,10);
  348. cprintf("║              BUSCAEXE               ║\n"); gotoxy(20,11);
  349. cprintf("║ (c) 1997  Por Javier Guerrero Diaz. ║\n"); gotoxy(20,12);
  350. cprintf("║ Rastrea el sector de arranque de la ║\n"); gotoxy(20,13);
  351. cprintf("║  unidad especificada como parámetro ║\n"); gotoxy(20,14);
  352. cprintf("║     en busca del virus ANTIEXE.     ║\n"); gotoxy(20,15);
  353. cprintf("╚═════════════════════════════════════╝\n");
  354. textattr(LIGHTGRAY|BLACK<<4);tecla=getch();
  355. clrscr();
  356. }
  357.  
  358. void fin(void)
  359. {
  360. window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
  361. cprintf("                                                  ");
  362. gotoxy(24,23); cprintf("PROGRAMA FINALIZADO.");
  363. _setcursortype(_NORMALCURSOR); textattr(LIGHTGRAY|BLACK<<4);
  364. gotoxy(24,1);
  365. exit(0);
  366. }
  367.  
  368. void mal(void)
  369. {
  370. window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
  371. cprintf("                                                  ");
  372. gotoxy(24,23); cprintf("PROGRAMA FINALIZADO ANORMALMENTE.");
  373. _setcursortype(_NORMALCURSOR); textattr(LIGHTGRAY|BLACK<<4);
  374. gotoxy(24,1);
  375. exit(-1);
  376. }
  377.  
  378. void errorhand(numerror)
  379. int numerror;
  380. {
  381.     switch(numerror)
  382.     {
  383.     case 0x0100:    mensaje("Error: Función no permitida.");
  384.             break;
  385.     case 0x0200:    mensaje("Error: Marca de direcciones no encontrada.");
  386.             break;
  387.     case 0x0300:    mensaje("Error: Disquete protegido contra escritura.");
  388.             break;
  389.     case 0x0400:    mensaje("Error: Sector no encontrado.");
  390.             break;
  391.     case 0x0600:
  392.             if (cambio!=2) 
  393.             { mensaje("Error: Disco retirado, pulsa tecla para repetir lectura.");
  394.                getch(); }
  395.             leeboot(); buscaenboot();
  396.             break;
  397.     case 0x0800:    mensaje("Error: Desbordamiento de DMA.");
  398.             break;
  399.     case 0x0900:    cprintf("Error: Superado el límite de 64k de segmento.");
  400.             break;
  401.     case 0x0c00:    mensaje("Error: Tipo de entorno no hallado.");
  402.             break;
  403.     case 0x1000:    mensaje("Error: Fallo de lectura.");
  404.             break;
  405.     case 0x2000:    mensaje("Error: Fallo de controladora de disco.");
  406.             break;
  407.     case 0x4000:    mensaje("Error: Pista no encontrada.");
  408.             break;
  409.     case 0x8000:    mensaje("Error: Time Out; unidad no responde.");
  410.             break;
  411.     default:        mensaje("Error: Fallo general.");
  412.             break;
  413.     }
  414. mal();
  415. }
  416.  
  417. void mensaje(mensa)
  418. char mensa[50];
  419. {
  420. window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
  421. cprintf("                                                  ");
  422. gotoxy(24,23); cprintf("%s",mensa); putch(7);
  423. sleep(1); gotoxy(24,23);
  424. cprintf("                                                  ");                 
  425. }
  426.  
  427. void panta(void)
  428. {
  429. window(20,2,60,7);
  430. gotoxy(1,1);
  431. textattr(YELLOW|BLUE<<4);
  432. cprintf("╔═══════════════════════════════════════╗");
  433. cprintf("║  BUSCAEXE: DETECTOR DEL VIRUS ANTIEXE ║");
  434. cprintf("║     (C) Por Javier Guerrero Diaz      ║");
  435. cprintf("╚═══════════════════════════════════════╝");
  436. window(1,22,80,25);
  437. cprintf("╔══════════════════════════════════════════════════════════════════════════════╗");
  438. cprintf("║ RESULTADO OPERACION:                                                         ║");
  439. cprintf("╚══════════════════════════════════════════════════════════════════════════════╝");
  440. textattr(WHITE|BLUE<<4); window(1,1,80,25);
  441. }
  442.